package com.twq.basic

import java.io.File

import scala.io.Source

/**
 * Created by tangweiqun on 2017/11/18.
 */
object ImplicitKeyWord {
  def main(args: Array[String]): Unit = {
    //1、修饰方法，我们称之为：隐式方法
    implicit def intToString(x: Int) = x.toString

    implicit class RichFile(file: File) {
      def read = Source.fromFile(file).mkString
    }
    //2、修饰类，我们称之为：隐式类
    new java.io.File(".").read

    //3、修饰对象，我们称之为：隐式对象
    implicit object StringOrdering extends Ordering[String] {
      override def compare(x: String, y: String): Int = x.length - y.length
    }
    List("sss", "d", "ddddd").sorted

    //4、修饰变量，我们称之为：隐式变量
    implicit val test = 5

    //5、修饰参数，我们称之为：隐式参数
    findAnInt

    //implicitly，这个其实是定义在scala.Predef中的一个方法
    //方法的定义为：def implicitly[T](implicit e: T) = e
    //调用这个方法则表示从当前的隐式作用域中查找到类型为T的隐式实体
    implicitly[Ordering[String]]
    implicitly[Int]
  }

  def findAnInt(implicit x: Int) = x
}


